package cn.stylefeng.guns.sys.modular.dict.util;

import cn.stylefeng.guns.sys.modular.dict.entity.SysDictData;
import cn.stylefeng.guns.sys.modular.dict.entity.SysDictType;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author S-CH
 * @Date 2024/7/3 15:48
 * @Version 1.0
 */
public class DictUtil {

    private static Map<Long, List<SysDictData>> dictCache = new ConcurrentHashMap<>();
    private static Map<String, Long> typeIdCache = new ConcurrentHashMap<>();


    /**
     * 初始化字典缓存
     *
     * @param dictTypes 字典类型列表
     * @param dictDataMap 字典数据按类型ID分组的Map
     */
    public static void init(List<SysDictType> dictTypes, Map<Long, List<SysDictData>> dictDataMap) {
        // 清空现有缓存
        dictCache.clear();
        typeIdCache.clear();

        // 将字典数据放入缓存
        for (SysDictType type : dictTypes) {
            List<SysDictData> dataList = dictDataMap.get(type.getId());
            if (dataList != null) {
                dictCache.put(type.getId(), dataList);
                typeIdCache.put(type.getCode(), type.getId());
            }
        }
    }

    /**
     * 根据字典类型ID和字典编码获取字典值
     *
     * @param typeId 字典类型ID
     * @param code   字典编码
     * @return 字典值，如果找不到返回null
     */
    public static String getDictValue(Long typeId, String code) {
        List<SysDictData> dataList = dictCache.get(typeId);
        if (dataList != null) {
            for (SysDictData data : dataList) {
                if (code.equals(data.getCode())) {
                    return data.getValue();
                }
            }
        }
        return null;
    }

    /**
     * 根据字典类型ID和字典值获取字典编码
     *
     * @param typeId 字典类型ID
     * @param value  字典值
     * @return 字典编码，如果找不到返回null
     */
    public static String getDictCode(Long typeId, String value) {
        List<SysDictData> dataList = dictCache.get(typeId);
        if (dataList != null) {
            for (SysDictData data : dataList) {
                if (value.equals(data.getValue())) {
                    return data.getCode();
                }
            }
        }
        return null;
    }

    /**
     * 根据字典类型编码获取字典类型ID
     *
     * @param typeCode 字典类型编码
     * @return 字典类型ID，如果找不到返回null
     */
    public static Long getTypeIdByCode(String typeCode) {
        return typeIdCache.get(typeCode);
    }
}
